cookie中因domain设置引发的问题 您所在的位置:网站首页 setcookie 无效 cookie中因domain设置引发的问题

cookie中因domain设置引发的问题

#cookie中因domain设置引发的问题| 来源: 网络整理| 查看: 265

                                               cookie中因domain设置引发的问题

场景:项目采用springboot构建,为了解决tomcat分布式的问题,采用根域名进行配置,session共享问题中,创建自定义的CookieUtil类,实现读,写,删除cookie的操作,部分代码如下

private final static String COOKIE_DOMAIN = ".stormstudio.top"; private final static String COOKIE_NAME = "cbt_token"; //X:domain=".happymmall.com" //a:A.happymmall.com cookie:domain=A.happymmall.com;path="/" //b:B.happymmall.com cookie:domain=B.happymmall.com;path="/" //c:A.happymmall.com/test/cc cookie:domain=A.happymmall.com;path="/test/cc" //d:A.happymmall.com/test/dd cookie:domain=A.happymmall.com;path="/test/dd" //e:A.happymmall.com/test cookie:domain=A.happymmall.com;path="/test" public static void writeLoginToken(HttpServletResponse response,String token){ Cookie ck = new Cookie(COOKIE_NAME,token); ck.setDomain(COOKIE_DOMAIN); ck.setPath("/");//代表设置在根目录 ck.setHttpOnly(true); //单位是秒。 //如果这个maxage不设置的话,cookie就不会写入硬盘,而是写在内存。只在当前页面有效。 ck.setMaxAge(60 * 60 * 24 * 365);//如果是-1,代表永久 response.addCookie(ck); }

springboot解决这个内置的tomcat问题,对cookie的处理的cookieConfig类

在本地调试以及运行是没有问题的,但是没有想到部署到线上出现:

java.lang.IllegalArgumentException: An invalid domain [.stormstudio.top] was specified for this cookie     at org.apache.tomcat.util.http.Rfc6265CookieProcessor.validateDomain(Rfc6265CookieProcessor.java:203)     at org.apache.tomcat.util.http.Rfc6265CookieProcessor.generateHeader(Rfc6265CookieProcessor.java:145)     at org.apache.catalina.connector.Response.generateCookieString(Response.java:983)     at org.apache.catalina.connector.Response.addCookie(Response.java:931)     at org.apache.catalina.connector.ResponseFacade.addCookie(ResponseFacade.java:386)     at javax.servlet.http.HttpServletResponseWrapper.addCookie(HttpServletResponseWrapper.java:58)     at com.szcbt.finance.web.utils.cookie.CookieUtil.writeLoginToken(CookieUtil.java:51)     at com.szcbt.finance.web.controller.user.common.UserLoginController.login(UserLoginController.java:277)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     at java.lang.reflect.Method.invoke(Method.java:498)

关键字处的异常信息:

java.lang.IllegalArgumentException: An invalid domain [.stormstudio.top] was specified for this cookie解决方式:

设置的COOKIE_DOMAIN的值为“stormstudio.top”,在一级域名前有一个点,把这个点去除掉。

线上采用的tomcat版本:apache-tomcat-8.5.40.tar.gz,这个是tomcat版本的问题导致的。

那采用tomcat的8.5以下的版本会不会出问题,经过测试发现,是没有问题的。

那来深入看一下这个是什么问题?看tomcat的版本处理情况。

查看tomcat8.5的版本源码,可以看到Rfc6265CookieProcessor中的validateDomain对domain的处理,关键代码贴出

domain规则如下  1、必须是1-9、a-z、A-Z、. 、- (注意是-不是_)这几个字符组成 2、必须是数字或字母开头(开头加点是出错的,如".stormstudio.top") 2、必须是数字或字母结尾 

path的规则源码及规则

1、字符必须是在 0x20-0x7E之间,并且不能出现”;”号

cookie value 源码及规则

1、会自动去除开头和结尾的引号”  2、如果包含以下规则字符则校验失败:  c < 0x21 || c == 0x22 || c == 0x2c || c == 0x3b || c == 0x5c || c == 0x7f

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有